package kr.ac.ssu.ailab.Model.Data;

import java.awt.Point;
import java.util.ArrayList;
import java.util.Map;
import java.util.Vector;
import kr.ac.ssu.ailab.Control.GraphControl;

/**
 * 맵을 구성하는 셀을 한 단위로 묶은 클러스터 클래스
 * 
 * @author Neil
 * */
public class Cluster
{
	private Point position;
	private int seqCluster;
	private int level;
	private Graph graph;
	private Vector<Integer> connectedList;
	private Vector<Integer> failedList;
	private ArrayList<Cell> standCell = null;

	/**
	 * 생성자
	 * 
	 * @param position
	 * @param level
	 */
	public Cluster(Point position, int level)
	{
		this.position = position;
		this.level = level;
		this.seqCluster = Integer.MAX_VALUE;
		this.connectedList = new Vector<Integer>();
		this.failedList = new Vector<Integer>();
		this.standCell = new ArrayList<Cell>();
	}

	/**
	 * 그래프 구성시에 주변의 연결된 클러스터의 리스트를 추가하는 메소드 method
	 * 
	 * @param clusterNum
	 */
	public void addConnectedList(int clusterNum)
	{
		this.connectedList.add(clusterNum);
	}

	/**
	 * 그래프 구성시에 주변과 연결이 불가한 클러스터의 리스트를 추가하는 메소드
	 * 
	 * @param clusterNum
	 */
	public void addfailedList(int clusterNum)
	{
		this.failedList.add(clusterNum);
	}

	/**
	 * 그래프 구성시에 주변의 연결된 클러스터의 리스트를 get 하는 메소드
	 * 
	 * @return
	 */
	public Vector<Integer> getConnectedList()
	{
		return this.connectedList;
	}

	/**
	 * 그래프 구성시에 주변과 연결이 불가한 클러스터의 리스트를 get 하는 메소드
	 * 
	 * @return
	 */
	public Vector<Integer> getFailedList()
	{
		return this.failedList;
	}

	/**
	 * 클러스터의 Position 을 get 하는 메소드
	 * 
	 * @return
	 */
	public Point getPosition()
	{
		return this.position;
	}

	/**
	 * 클러스터가 어떤 일련번호를 가지고 있는지 get 하는 메소드 각각의 클러스터마다 구분이 가능한 번호를 가지고 있고 셀들역시 어떤
	 * 클러스터에 속해있지 알게 하기 위해서 클러스터 번호를 가지고 있다.
	 * 
	 * @return
	 */
	public int getSeqCluster()
	{
		return seqCluster;
	}

	/**
	 * 클러스터의 일련번호를 set 하는 메소드
	 * 
	 * @param seqCluster
	 */
	public void setSeqCluster(int seqCluster)
	{
		this.seqCluster = seqCluster;
	}

	/**
	 * 클러스터에서 StandCell을 add 하는 method
	 * 
	 * @param standCell
	 */
	public void addStandCell(Cell standCell)
	{
		this.standCell.add(standCell);
	}

	/**
	 * 클러스터에서 StandCell을 get 하는 method
	 * 
	 * @return
	 */
	public ArrayList<Cell> getStandCell()
	{
		return standCell;
	}

	/**
	 * 기존에 클러스터에서 지니고 있던 클러스터 연결에 대한 정보를 Reset 하는 메소드
	 */
	public void resetConnectAndFailList()
	{
		this.connectedList = new Vector<Integer>();
		this.failedList = new Vector<Integer>();
	}

}
